package com.example.springboot3demo.controller;

import com.example.springboot3demo.config.RabbitMQConfig;
import com.example.springboot3demo.mq.MessageProducer;
import com.example.springboot3demo.mq.dto.MessageDto;
import com.example.springboot3demo.mq.dto.TestDto;
import com.example.springboot3demo.service.MethodSyncTestService;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.tags.Tag;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import java.util.UUID;

/**
 * RabbitMQ综合测试控制器
 * 
 * 该控制器提供REST API端点来测试RabbitMQ的各种功能，包括：
 * 1. 基本文本消息发送
 * 2. 对象消息发送
 * 3. 基于RabbitMQ的实例间方法同步测试
 * 
 * @author Your Name
 * @date 2024-01-01
 */
@Slf4j
@RestController
@RequestMapping("/rabbitmq")
@Tag(name = "RabbitMQ测试", description = "用于测试RabbitMQ的各种功能")
public class RabbitMQController {
    
    @Autowired
    private MessageProducer messageProducer;
    
    @Autowired
    private MethodSyncTestService methodSyncTestService;
    
    /**
     * 发送基本文本消息
     * 
     * @param message 消息内容
     * @return 发送结果
     */
    @GetMapping("/send-text")
    @Operation(summary = "发送基本文本消息", description = "发送基本文本消息到RabbitMQ队列")
    public String sendTextMessage(@RequestParam String message) {
        messageProducer.sendMessage(RabbitMQConfig.ROUTING_KEY, message);
        return "Text message sent: " + message;
    }
    
    /**
     * 发送对象消息
     * 
     * @param content 消息内容
     * @return 发送结果
     */
    @GetMapping("/send-object")
    @Operation(summary = "发送对象消息", description = "发送对象消息到RabbitMQ队列")
    public String sendObjectMessage(@RequestParam String content) {
        // 创建消息对象
        MessageDto messageDto = new MessageDto(
            UUID.randomUUID().toString(),
            content,
            System.currentTimeMillis(),
            "RabbitMQController"
        );
        
        // 发送对象消息
        messageProducer.sendObjectMessage(RabbitMQConfig.ROUTING_KEY, messageDto);
        
        return "Object message sent: " + messageDto;
    }
    
    /**
     * 测试方法同步
     * 
     * @param message 消息内容
     * @return 测试结果
     */
    @GetMapping("/sync-method")
    @Operation(summary = "测试方法同步", description = "调用此接口会触发方法同步机制")
    public String syncMethod(@RequestParam String message) {
        methodSyncTestService.syncMethod(message);
        return "方法同步测试成功: " + message;
    }
    
    /**
     * 测试带参数的方法同步
     * 
     * @param id ID
     * @param name 名称
     * @param count 数量
     * @return 测试结果
     */
    @GetMapping("/sync-method-with-params")
    @Operation(summary = "测试带参数的方法同步", description = "调用此接口会触发带参数的方法同步机制")
    public String syncMethodWithParams(
            @RequestParam Long id,
            @RequestParam String name,
            @RequestParam Integer count) {
        methodSyncTestService.syncMethodWithParams(id, name, count);
        return "带参数的方法同步测试成功: id=" + id + ", name=" + name + ", count=" + count;
    }
    
    /**
     * 测试带对象参数的方法同步
     * 
     * @param name 名称
     * @param age 年龄
     * @param active 是否激活
     * @return 测试结果
     */
    @GetMapping("/sync-method-with-object")
    @Operation(summary = "测试带对象参数的方法同步", description = "调用此接口会触发带对象参数的方法同步机制")
    public String syncMethodWithObject(
            @RequestParam String name,
            @RequestParam int age,
            @RequestParam boolean active) {
        // 创建TestDto对象
        TestDto testDto = new TestDto(name, age, active);
        
        // 调用带对象参数的方法
        methodSyncTestService.syncMethodWithObject(testDto);
        
        return "带对象参数的方法同步测试成功: name=" + name + ", age=" + age + ", active=" + active;
    }
}